// ------------------------------------------------------------
// Create a zero-terminated phrase at 0x1000.
// Copy it to 0x2000 while converting lowercase letters
// to uppercase.
//
// Then display both strings.
//
// Original:  Hello, RISC-V!
// Converted: HELLO, RISC-V!
// ------------------------------------------------------------

start:

// ------------------------------------------------------------
// Create "Hello, RISC-V!" at address 0x1000.
// ------------------------------------------------------------

lui  x1, 1

addi x3, x0, 72
sb   x3, 0(x1)

addi x3, x0, 101
sb   x3, 1(x1)

addi x3, x0, 108
sb   x3, 2(x1)

addi x3, x0, 108
sb   x3, 3(x1)

addi x3, x0, 111
sb   x3, 4(x1)

addi x3, x0, 44
sb   x3, 5(x1)

addi x3, x0, 32
sb   x3, 6(x1)

addi x3, x0, 82
sb   x3, 7(x1)

addi x3, x0, 73
sb   x3, 8(x1)

addi x3, x0, 83
sb   x3, 9(x1)

addi x3, x0, 67
sb   x3, 10(x1)

addi x3, x0, 45
sb   x3, 11(x1)

addi x3, x0, 86
sb   x3, 12(x1)

addi x3, x0, 33
sb   x3, 13(x1)


// Zero terminator.

sb   x0, 14(x1)

// ------------------------------------------------------------
// Copy and capitalize.
//
// x1 = source address 0x1000
// x2 = destination address 0x2000
// ------------------------------------------------------------

lui  x1, 1
lui  x2, 2

CopyLoop:

lb   x3, 0(x1)

// End when zero is found.

beq  x3, x0, CopyTerminator

// If character is below 'a', do not convert.

slti x4, x3, 97
bne  x4, x0, StoreCharacter

// If character is above 'z', do not convert.
// x4 is 1 when x3 is less than 123.

slti x4, x3, 123
beq  x4, x0, StoreCharacter

// Convert lowercase to uppercase.

addi x3, x3, -32

StoreCharacter:

sb   x3, 0(x2)

// Advance the byte addresses.

addi x1, x1, 1
addi x2, x2, 1

jal  x0, CopyLoop

CopyTerminator:

// Add the zero terminator to the uppercase string.

sb   x0, 0(x2)

// ------------------------------------------------------------
// Display both zero-terminated strings.
//
// Reload their starting addresses because x1 and x2 were
// advanced during the copy loop.
// ------------------------------------------------------------

lui  x1, 1
lui  x2, 2

cout << "Original message:  " << _string x1 << endl;
cout << "Uppercase message: " << _string x2 << endl;

ProgramDone:


